<?php

namespace app\api\controller\v1;

use app\BaseController;
use function GuzzleHttp\Psr7\str;
use think\facade\Db;
use think\Request;
use app\middleware\Check;

/**
 * Class 微信授权 用户端
 * @package app\controller
 */
class WxSdk extends BaseController
{
//    protected $middleware = [Check::class];
    /*
     * 百度授权回调
     */
    /**
     * @desc 微信
     */
    //微信配置
    public function get_sign(Request $request)
    {
        // 微信 JS 接口签名校验工具: https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign
        $url = $this->request->param('url');//分享地址
//        $id = $this->request->param('id');//用户ID
//        $user = Db::table('eb_user')->where('id', $id)->find();
        if (empty($url)) return jsonFail('缺少参数');
        require_once '../sdk/WxpayAPI/lib/WxPay.Config.php';
        $appid = \WxPayConfig::APPID;
        $url = $this->request->param('url');;
        $secret = \WxPayConfig::APPSECRET;
        //获取token
        $fileName = '../sdk/WxpayAPI/wechat_token.txt';
        $token_data = file_get_contents($fileName);
        $time = 7200;
        if (!empty($token_data)) {
            $token_data = json_decode($token_data, true);
            $time = time() - $token_data['time'];
        }
        if ($time > 3600) {
            $token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$appid}&secret={$secret}";
            $token_res = $this->https_request($token_url);
            $token_res = json_decode($token_res, true);
            $token = $token_res['access_token'];
            $data = array(
                'time' => time(),
                'token' => $token
            );
            $res = file_put_contents($fileName, json_encode($data));
        } else {
            $token = $token_data['token'];
        }
        // 获取ticket
        $ticket_data = file_get_contents('../sdk/WxpayAPI/wechat_ticket.txt');
        $time1 = 7200;
        if (!empty($ticket_data)) {
            $ticket_data = json_decode($ticket_data, true);
            $time1 = time() - $ticket_data['time'];
        }
        if ($time1 > 3600) {
            $ticket_url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token={$token}&type=jsapi";
            $ticket_res = $this->https_request($ticket_url);
            $ticket_res = json_decode($ticket_res, true);
            $ticket = $ticket_res['ticket'];
            $data = array(
                'time' => time(),
                'ticket' => $ticket
            );
            $res = file_put_contents('../sdk/WxpayAPI/wechat_ticket.txt', json_encode($data));
            if ($res) {
//                echo '更新 ticket 成功';
            }
        } else {
            $ticket = $ticket_data['ticket'];
        }
        // 进行sha1签名
        $timestamp = time();
        $nonceStr = $this->createNonceStr();
        // 注意 URL 建议动态获取(也可以写死).
        $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
//        $url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; // 调用JSSDK的页面地址
//        $url = $_SERVER['HTTP_REFERER']; // 前后端分离的, 获取请求地址(此值不准确时可以通过其他方式解决)
        $str = "jsapi_ticket={$ticket}&noncestr={$nonceStr}&timestamp={$timestamp}&url={$url}";
        $sha_str = sha1($str);
//        if (!empty($user['openid'])) {
//            $ds = json_decode(self::is_subscribe($user['openid'], $token), true);
//        }
        $signPackage = array(
            "url" => $url,
            "ticket" => $ticket,
            "appId" => $appid,
            "nonceStr" => $nonceStr,
            "timestamp" => $timestamp,
            "signature" => $sha_str,
//            "subscribe" => $ds['subscribe'],
        );
        return jsonSuccess('获取成功', $signPackage);
    }

    /**判断用户是否关注
     * @param Request $request
     * @return \think\response\Json
     */
    public function is_subscribe($openid, $token)
    {
        $subscribe_msg = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=$token&openid=$openid";
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $subscribe_msg);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
        if (!empty($data)) {
            curl_setopt($curl, CURLOPT_POST, 1);
            curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
        }
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        $res = curl_exec($curl);
        curl_close($curl);
        return $res;
    }

    //随机字符串
    public function createNonceStr($length = 16)
    {
        $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        $str = "";
        for ($i = 0; $i < $length; $i++) {
            $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
        }
        return $str;
    }
    // 模拟 http 请求
    public function https_request($url, $data = null)
    {
        $header  = array(
            'Authorization:'.'123456'
        );
        // curl 初始化
        $curl = curl_init();
        // curl 设置
        curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
        // 判断 $data get  or post
        if (!empty($data)) {
            curl_setopt($curl, CURLOPT_POST, 1);
            curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
        }
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        // 执行
        $res = curl_exec($curl);
        curl_close($curl);
        return $res;
    }
}
